#pragma once

#include "Mutex.hpp"

using namespace MutexModule;

namespace CondModule
{
    class Cond
    {
    public:
        // 构造
        Cond()
        {
            int n = pthread_cond_init(&_cond, nullptr);
            (void)n;
        }

        // 等待
        void Wait(Mutex &mutex)
        {
            int n = pthread_cond_wait(&_cond, &mutex.GetMutex());
            (void)n;
        }

        // 唤醒一个线程
        void Signal()
        {
            // 唤醒在条件变量等待下的一个线程
            int n = pthread_cond_signal(&_cond);
            (void)n;
        }

        // 唤醒所有线程
        void Broadcast()
        {
            // 唤醒在条件变量等待下的所有线程
            int n = pthread_cond_broadcast(&_cond);
            (void)n;
        }

        // 析构
        ~Cond()
        {
            int n = pthread_cond_destroy(&_cond);
            (void)n;
        }

    private:
        pthread_cond_t _cond;
    };
}